/**
 * 
 */
package org.yelongframework.ognl;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

/**
 * OGNL包装器
 * 
 * @since 1.0.0
 */
public class OgnlWrapper implements Ognlable {

	/** OGNL上下文 */
	private OgnlContext ognlContext = new OgnlContext();

	// ==================================================constructor==================================================

	public OgnlWrapper() {
	}

	/**
	 * @param root 根对象
	 */
	public OgnlWrapper(Object root) {
		setRoot(root);
	}

	// ==================================================put==================================================

	/**
	 * 添加对象
	 * 
	 * @param key   键
	 * @param value 值
	 */
	public void put(String key, Object value) {
		ognlContext.put(key, value);
	}

	// ==================================================getValue==================================================

	@Override
	public Object getValue(String expression) throws OgnlableException {
		try {
			return Ognl.getValue(expression, ognlContext, ognlContext.getRoot());
		} catch (OgnlException e) {
			throw new OgnlableException(e);
		}
	}

	// ==================================================setValue==================================================

	@Override
	public void setValue(String expression, Object value) throws OgnlableException {
		try {
			Ognl.setValue(expression, ognlContext, ognlContext.getRoot(), value);
		} catch (OgnlException e) {
			throw new OgnlableException(e);
		}
	}

	// ==================================================root==================================================

	/**
	 * @param root 根对象
	 */
	public void setRoot(Object root) {
		ognlContext.setRoot(root);
	}

	/**
	 * @return 根对象
	 */
	public Object getRoot() {
		return ognlContext.getRoot();
	}

}
